# -*- coding: utf-8 -*-
from flask import Blueprint, make_response, request
from flask_restful import Api
#import traceback
import json
from app import csrf
from app import app_
api_log = app_.logger
import copy
nds_api = Blueprint('api', __name__)


@nds_api.errorhandler(Exception)
def internal_error(exception):

	api_log.exception(exception)
	# return output_json({"errcode": 500, "errmsg": exception.message}, 200)
	return output_json({"errcode": 500, "errmsg": exception}, 200)


errors = {
    'UserAlreadyExistsError': {
        'message': "A user with that username already exists.",
        'status': 409,
    },
    'ResourceDoesNotExist': {
        'message': "A resource with that ID no longer exists.",
        'status': 410,
        'extra': "Any extra information you want.",
    },
}

restful_api = Api(catch_all_404s=True, errors=errors, decorators=[csrf.exempt])
restful_api.init_app(nds_api)


class MyEncoder(json.JSONEncoder):
	def default(self, obj):
		"""
		只要检查到了是bytes类型的数据就把它转为str类型
		:param obj:
		:return:
		"""
		if isinstance(obj, bytes):
			return str(obj, encoding='utf-8')
		return json.JSONEncoder.default(self, obj)



@restful_api.representation('application/json')
def output_json(data, code, headers=None):
	"""
	Makes a Flask response with a JSON encoded body
	数据返回统一格式化
	data 返回的数据
	errcode 返回的状态码
	errmsg 返回的状态
	状态码	原生描述	描述
	200	OK	服务器成功响应客户端的请求。
	400 （错误请求） 服务器不理解请求的语法。
	401 （未授权） 请求要求身份验证。 对于需要登录的网页，服务器可能返回此响应。
	403 （禁止） 服务器拒绝请求。
	404 （未找到） 服务器找不到请求的网页。
	405 （方法禁用） 禁用请求中指定的方法。
	406 （不接受） 无法使用请求的内容特性响应请求的网页。
	407 （需要代理授权） 此状态代码与 401（未授权）类似，但指定请求者应当授权使用代理。
	408 （请求超时） 服务器等候请求时发生超时。
	409 （冲突） 服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。
	410 （已删除） 如果请求的资源已永久删除，服务器就会返回此响应。
	411 （需要有效长度） 服务器不接受不含有效内容长度标头字段的请求。
	412 （未满足前提条件） 服务器未满足请求者在请求中设置的其中一个前提条件。
	413 （请求实体过大） 服务器无法处理请求，因为请求实体过大，超出服务器的处理能力。
	414 （请求的 URI 过长） 请求的 URI（通常为网址）过长，服务器无法处理。
	415 （不支持的媒体类型） 请求的格式不受请求页面的支持。
	416 （请求范围不符合要求） 如果页面无法提供请求的范围，则服务器会返回此状态代码。
	417 （未满足期望值） 服务器未满足”期望”请求标头字段的要求。
	500	Internal server error	服务器内部错误，比如出现了bug
	"""
	callback_name_source = 'jsonp'

	def init_return_data(code, data):
		return_data = {}
		status = code
		if 200 <= code and 299 >= code:
			status = 0
		return_data['errcode'] = status
		return_data['errmsg'] = data['message'] if 'message' in data else 'ok'
		return_data['errmsg'] = data['errmsg'] if 'errmsg' in data else return_data['errmsg']
		if 'errcode' in data:
			return_data['errcode'] = data['errcode']
			return_data['errmsg'] = data['errmsg'] if 'errmsg' in data else ''
		if 'data' in data:
			return_data['data'] = data['data']
			if 'total' in data['data'] and 'list' not in data['data']:
				data['data']['list'] = []
			data_ = copy.deepcopy(data)
			del data_['data']
			return_data.update(data_)
		elif isinstance(data, list):
			return_data['data'] = {"total": 0, "list": []}
			return_data['data']['total'] = len(data)
			return_data['data']['list'] = data
		else:
			return_data.update(data)
	return_data = init_return_data(code, data)
	# 支持jsonp
	jsonp_callback = request.args.get(callback_name_source, False) or ''
	if jsonp_callback:
		# resp.set_data(str(callback) + '(' + resp.get_data().decode("utf-8") + ')')
		return_data2 = str(jsonp_callback) + '(' + json.dumps(return_data).decode("utf-8") + ')'
	else:
		return_data2 = json.dumps(return_data, cls=MyEncoder)
	resp = make_response(return_data2, code)
	# resp.headers['Access-Control-Allow-Origin'] = '*'
	# resp.headers['Access-Control-Allow-Methods'] = 'GET,POST,OPTIONS'
	# resp.headers['Access-Control-Allow-Headers'] = 'Origin,X-Requested-With,Content-Type,Accept'
	# if 'flask_cookies' in return_data:
	#     flask_cookies = return_data['flask_cookies']
	#     del return_data['flask_cookies']
	#     for i in flask_cookies:
	#         resp.set_cookie(str(i), str(flask_cookies[i]))
	resp.headers.extend(headers or {})
	return resp


from app.api.routes import *
